import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './plugins/element.js'
import 'babel-polyfill'
import md5 from 'js-md5'
import {
    getToken,
    getUserId
} from '@/api/auth' // get token from cookie

// rem h5 适配
import 'amfe-flexible/index.js'

import './styles/index.scss' // global css
//vant
import {
    Button,
    Field,
    Icon,
    Toast,
    Notify
} from 'vant';

Vue.use(Button).use(Field).use(Icon).use(Toast).use(Notify);
Vue.prototype.$md5 = md5

Vue.config.productionTip = false


//正则表达式验证是否空
Vue.prototype.$isNull = function (v) {
    if (v == "") return true;
    var regu = "^[ ]+$";
    var re = new RegExp(regu);
    return re.test(v);
}

//正则表达式验证手机号
Vue.prototype.$telText = (rule, value, callback) => {
    var mobile = /^1(3|4|5|6|7|8|9)\d{9}$/;
    if (mobile.test(value)) {
        callback()
    } else {
        return callback(new Error('请输入正确的手机号'));
    }
}

//正则表达式验证数字
Vue.prototype.$numberText = (rule, value, callback) => {
    var reg = /(^[1-9]\d*$)/;
    if ((reg.test(value))) {
        if (value > 2147483647) {
            return callback(new Error('输入超出最大值'));
        } else {
            callback()
        }

    } else {
        return callback(new Error('请输入正整数'));
    }
}


//正则表达式验证邮箱
Vue.prototype.$emailText = function (v) {
    var email = /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/;
    if (email.test(v)) {
        return true;
    } else {
        return false;
    }
}

//正则表达式验证密码
Vue.prototype.$passwordText = function (v) {
    var password = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$).{8,16}$/; //密码正则 密码包含 数字,英文,字符中的两种以上，长度8-16位
    if (password.test(v)) {
        return true;
    } else {
        return false;
    }
}

//时间戳转换方法    date:时间戳数字
Vue.prototype.$formatDate = function (date) {
    var date = new Date(date);
    var YY = date.getFullYear() + '-';
    var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
    var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate());
    var hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
    var mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
    var ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
    return YY + MM + DD + " " + hh + mm + ss;
}

//时间戳转换方法    date:时间戳数字
Vue.prototype.$formatDateDay = function (date) {
    var date = new Date(date);
    var YY = date.getFullYear() + '-';
    var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
    var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate());
    return YY + MM + DD;
}

//时间戳转换方法    date:时间戳数字
Vue.prototype.$formatDateMonth = function (date) {
    var date = new Date(date);
    var YY = date.getFullYear() + '.';
    var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
    return YY + MM
}

//计算生日(时间差)
Vue.prototype.$getDateDifference = function (str) {
    let val;
    let strArr = str.split("-");
    let year = strArr[0];
    let month = strArr[1];
    let day = strArr[2];
    let d = new Date();
    let nowYear = d.getFullYear();
    let nowMonth = d.getMonth() + 1;
    let nowDay = d.getDate();
    if (nowYear == year) {
        val = 0;//同年 则为0岁
    } else {
        let ageDiff = nowYear - year; //年之差
        if (ageDiff > 0) {
            if (nowMonth == month) {
                let dayDiff = nowDay - day;//日之差
                if (dayDiff < 0) {
                    val = ageDiff - 1;
                } else {
                    val = ageDiff;
                }
            } else {
                let monthDiff = nowMonth - month;//月之差
                if (monthDiff < 0) {
                    val = ageDiff - 1;
                } else {
                    val = ageDiff;
                }
            }
        } else {
            val = -1;//返回-1 表示出生日期输入错误 晚于今天
        }
    }
    return val;//返回时间差
}

/* 判断用户是否登录 弹出登录*/
Vue.prototype.userLoginFlag = function (type) {
    let loginStatus = localStorage.getItem("loginStatus");
    if (loginStatus == 0 || loginStatus == null || loginStatus == undefined || loginStatus == "") {
        this.$message.error('登录失效，请重新登录');
        setTimeout(() => {
            // this.$router.push({name: 'Login', query: {back: true}})
            this.$router.push({path: '/login', query: {back: true}})
        }, 1000)
        return false
    } else {
        return true
    }
}

/* 判断用户是否登录 不弹出登录*/
Vue.prototype.userLoginFlag1 = function () {
    let loginStatus = localStorage.getItem("loginStatus");
    if (loginStatus == 0 || loginStatus == null || loginStatus == undefined || loginStatus == "") {
        return false
    } else {
        return true
    }
}

//是否最后一页
Vue.prototype.$isLastPage = function (v) {
    if (0 == v.pages || v.pages == v.current) {
        return true;
    } else {
        return false;
    }
}

//加载失败（默认处理方法）
Vue.prototype.$loadError = function (res) {
    console.log("加载失败" + res)
}

/***
 * 废弃
 预处理图片，示例如：
 1.  this.contentList = this.$preImgs('cms_content',this.contentList.concat(res.result.records));
 2.    this.news =this.$preImgs("cms_content",res.result);
 * **/
Vue.prototype.$preImgs = function (type, v) {
    return v;
    // console.log("预处理图片"+typeof(v) +"Array.isArray(a)"+Array.isArray(v))
    // if(Array.isArray(v)){//处理数组
    // 	var arrs=[];
    // 	for(var i in v){
    // 		arrs.push(this.$preImg(type,v[i]));
    // 	}//end of for
    // 	return  arrs;
    // }else {//处理普通对象
    // 	return this.$preImg(type,v)
    // }
    //return v;
}

//废弃 ：私有方法，不建议调用
Vue.prototype.$preImg = function (type, item) {
    return v;

    // if(''==item.thumb_dictText||null==item.thumb_dictText){
    // 	return item;
    // }
    // var prefix="前缀测试"; //FIXME:环境稳定后调整
    // if('cms_content'==type){
    // 	item.thumb_dictText= prefix+item.thumb_dictText;
    // 	return item;
    // }
    // //FIXME:根据类型调整
    // console.log("未知类型，请自行调整："+type)
    // return item;
}
/***
 *
 * @param arr 需要裁剪的图片数组
 * @param size 两种形式 形式1 ： 300x500 形式2：300x500_80（其中300 是宽，500 是高 80 是比例）
 *  @param type
 * @returns https://testres.huanghehr.com/public/tailoring/2021/2/2/f917e8aaa1469fccae562a191739192e_300x500_80.jpg
 */
Vue.prototype.$imgResizes = function (arr, size, type) {

    let v = arr;
    // console.log("$imgResizes"+typeof(v) +"Array.isArray(a)"+Array.isArray(arr))
    if (Array.isArray(v)) {//处理数组
        let arrs = [];
        for (let i in v) {
            //console.log(i)
            let a = v[i];
            if (undefined == type || null == type || "" == type) {
                let imgUrl = a.image_dictText;
                a.image_dictText = this.$imgResize(imgUrl, size)

            } else if ("imageFileId_dictText" == type) {
                let imgUrl = a.imageFileId_dictText;
                a.imageFileId_dictText = this.$imgResize(imgUrl, size)
            } else {//  FIXME:根据类型调整
                console.log("未知类型，请自行调整：" + type)
            }
            //console.log(" type："+type +"" +imgUrl)
            arrs.push(a);

        }//end of for
        return arrs;
    } else {//处理普通对象
        console.log("非数组")
        return v;
    }

}
/***
 *
 * @param imgUrl 图片地址（如：https://testres.huanghehr.com/public/tailoring/2021/2/2/f917e8aaa1469fccae562a191739192e.jpg）
 * @param size 两种形式 形式1 ： 300x500 形式2：300x500_80（其中300 是宽，500 是高 80 是比例）
 * @returns https://testres.huanghehr.com/public/tailoring/2021/2/2/f917e8aaa1469fccae562a191739192e_300x500_80.jpg
 */
Vue.prototype.$imgResize = function (imgUrl, size) {
    console.log("process.env.NODE_ENV：" + process.env.NODE_ENV + " imgUrl" + imgUrl)
    if (null == imgUrl) {
        return imgUrl;
    }
    if (imgUrl.lastIndexOf(".") < 0) {
        return imgUrl;
    }

    let url = imgUrl;
    if (process.env.NODE_ENV == 'productionTest' || process.env.NODE_ENV == 'development') {//测试环境
        url = imgUrl.substring(0, imgUrl.lastIndexOf(".")) + "_" + size + imgUrl.substring(imgUrl.lastIndexOf("."), imgUrl.length)
        console.log("转换前：" + imgUrl + "===url===>:\r\n" + url)
    } else {
        console.log("当前环境不支持裁剪：" + process.env.NODE_ENV)
        url = imgUrl;
    }


    return url;

    // if(''==item.thumb_dictText||null==item.thumb_dictText){
    // 	return item;
    // }
    // var prefix="前缀测试"; //FIXME:环境稳定后调整
    // if('cms_content'==type){
    // 	item.thumb_dictText= prefix+item.thumb_dictText;
    // 	return item;
    // }
    // //FIXME:根据类型调整
    // console.log("未知类型，请自行调整："+type)
    // return item;
}
/**
 * 处理下载接口返回的文件流数据
 * @param {*} res http请求返回数据
 */
Vue.prototype.download = function (res) {
    // 错误处理
    if (res.data.type == "application/json") {
        let reader = new FileReader();
        reader.readAsText(res.data, 'utf-8');
        reader.onload = function () {
            let json_data = JSON.parse(reader.result);
            Message({
                showClose: true,
                message: json_data.Message,
                type: "error"
            });
        }
        return;
    }
    // 下载处理
    let filename = "content-disposition" in res.headers ?
        decodeURIComponent(
            res.headers["content-disposition"]
                .split(";")[1]
                .split("=")[1]
                .replace(/"/g, "")
        ) : "下载文件";
    try {
        if (window.navigator.msSaveOrOpenBlob) {
            navigator.msSaveBlob(res.data, filename);
        } else {
            let blob = new Blob([res.data], {
                type: "application/vnd.ms-excel"
            });
            let url = URL.createObjectURL(blob);
            let link = document.createElement("a");
            link.setAttribute("href", url);
            link.setAttribute("download", filename);
            link.style.display = "none";
            document.body.appendChild(link);
            link.click();
            URL.revokeObjectURL(url); // 释放URL 对象
            document.body.removeChild(link);
        }
    } catch (err) {
        // console.log(err)
    }
}


router.beforeEach(async (to, from, next) => {
    const token = !store.state.token && store.commit("SET_TOKEN", getToken())
    // const userId = !store.state.userId && store.commit("SET_USERID", getUserId())
    next()
})

new Vue({
    router,
    store,
    render: h => h(App)
}).$mount('#app')
